package br.uvv.Web.ManagedBean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.primefaces.context.RequestContext;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import br.uvv.Model.CenarioBase;
import br.uvv.Model.FluxoBase;
import br.uvv.Service.CenarioBaseService;
import br.uvv.Service.ClientePortalService;
import br.uvv.Util.InitUtil;
import br.uvv.Util.MsgUtil;
import br.uvv.Util.RNException;
import br.uvv.Util.Util;

public class CenarioBaseBean implements Serializable {

	private static final long serialVersionUID = 1602853470341561435L;

	private CenarioBaseService service;
	
	private CenarioBase cenarioBaseInstance;
	private LazyDataModel<CenarioBase> cenarioBaseList;
	private CenarioBase[] cenariosSelecionados;
	private String msgExclusao;
	
	private String varNome;
	private String varFluxo;
	
	public String cenarioBase(){
		init();
		return "/views/cenarioBase/show.xhtml";
	}
	
	private void simulaFluxos(){
		
		FluxoBase f001 = new FluxoBase();
		f001.setAcao("O usuário clica no botão de 'Buscar {0}'");
		f001.setCodFluxo("1");
		
		FluxoBase f002 = new FluxoBase();
		f002.setAcao("O sistema exibe o diálogo de busca de {1}");
		f002.setCodFluxo("2");
		
		FluxoBase f003 = new FluxoBase();
		f003.setAcao("O usuário preenche os filtros de busca de {2} e clica no botão 'Filtrar'");
		f003.setCodFluxo("3");
		
		FluxoBase f004 = new FluxoBase();
		f004.setAcao("O sistema realiza a busca nos registros de {2} e exibe os resultados que conferem com os filtros passados pelo usuário em uma lista dentro do diálogo");
		f004.setCodFluxo("4");
		
		FluxoBase f005 = new FluxoBase();
		f005.setAcao("Alternativamente, o usuário pode refazer a busca voltando ao passo 3");
		f005.setCodFluxo("4.1");
		
		cenarioBaseInstance.getFluxosBase().add(f001);
		cenarioBaseInstance.getFluxosBase().add(f002);
		cenarioBaseInstance.getFluxosBase().add(f003);
		cenarioBaseInstance.getFluxosBase().add(f004);
		cenarioBaseInstance.getFluxosBase().add(f005);
	}
	
	private void init(){
		service = new CenarioBaseService();
		cenarioBaseInstance = new CenarioBase();
		cenarioBaseList = InitUtil.inicializaCenarioBaseList();
		varNome = null;
		varFluxo = null;
		cenariosSelecionados = new CenarioBase[0];
	}
	
	public String goDesistir(){
		return "/views/cenarioBase/show.xhtml";
	}
	
	public String goCreate(){
		cenarioBaseInstance = new CenarioBase();
		cenarioBaseInstance.setFluxosBase(new ArrayList<FluxoBase>());
		simulaFluxos();
		return "/views/cenarioBase/create.xhtml"; 
	}
	
	public void save(){
		try {
			cenarioBaseInstance.setCliente(Util.getUsuarioLogado().getCliente());
			service.salvarCenario(cenarioBaseInstance);
			MsgUtil.msgSucesso("sal", cenarioBaseInstance.getNome());
		} catch (RNException e) {
			MsgUtil.msgErro("sal", cenarioBaseInstance.getNome());
			e.printStackTrace();
		}
	}
	
	public void goEdit(){
		cenarioBaseInstance = new CenarioBase();
		cenarioBaseInstance.setFluxosBase(new ArrayList<FluxoBase>());
	}
	
	public void update(){
		try {
			service.atualizarCenario(cenarioBaseInstance);
			MsgUtil.msgSucesso("atu", cenarioBaseInstance.getNome());
		} catch (RNException e) {
			MsgUtil.msgErro("atu", cenarioBaseInstance.getNome());
			e.printStackTrace();
		}
	}
	
	public void goDelete(){
 		RequestContext requestContext = RequestContext.getCurrentInstance();
		Integer length = cenariosSelecionados.length;
		if (length == 0){
			requestContext.execute("dialogoSelecione.show()");
			return;
		}
		String tmp = "";
		if (length == 1){
			tmp = "'" + cenariosSelecionados[0].getNome() + "'";
		} else {
			tmp = "'";
			Integer count = 0;
			for(CenarioBase c:cenariosSelecionados){
				tmp += c.getNome();
				count++;
				if (count==length-1)
					tmp += "' e '";
				else if (count==length)
					tmp += "'";
				else
					tmp += "', '";
			}
		}
		msgExclusao = MsgUtil.getMensagem("seg72_ExclusaoRegistros", tmp);
		requestContext.execute("dialogoExcluirBrowser.show()");
	}
	
	public void delete(){
		for (CenarioBase c:cenariosSelecionados){
			try {
				service.excluirCenario(c);
				MsgUtil.msgSucesso("exc", c.getNome());
			} catch (RNException e) {
				MsgUtil.msgErro("exc", c.getNome());
				e.printStackTrace();
			}
		}
	}
	
	public void filtrarTodos(){
		varNome = "";
		varFluxo = "";
		filtrarCenarioBase();
	}
	
	@SuppressWarnings("serial")
	public void filtrarCenarioBase(){
		cenarioBaseList = new LazyDataModel<CenarioBase>() {
			@Override
			public List<CenarioBase> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
				Util.setDataTableRows(pageSize);
				try {
					return service.listarCenarioBase(first, pageSize, sortField, sortOrder, varNome, varFluxo);
				} catch (RNException e) {
					e.printStackTrace();
					return new ArrayList<CenarioBase>();
				}
			}
			@Override  
	        public CenarioBase getRowData(String rowKey)  
	        {  
	        	try {
		            return service.selecionarCenarioBase(Long.parseLong(rowKey));
	        	} catch (RNException e) {
	        		e.printStackTrace();
	        		return new CenarioBase();
	        	} catch (NumberFormatException e){
	        		return new CenarioBase();
	        	}
	        }  
	        @Override  
	        public String getRowKey(CenarioBase objeto)  
	        {  
	        	if (objeto!=null)
	        		return ""+objeto.getId();
	        	return "";
	        }  
		};
		try {
			cenarioBaseList.setRowCount(service.countCenarioBase(varNome, varFluxo));
		} catch (RNException e) {
			e.printStackTrace();
		}
		cenarioBaseList.setPageSize(5);
	}
	
	public String goHome(){
		return "goHome";
	}

	public CenarioBase getCenarioBaseInstance() {
		return cenarioBaseInstance;
	}

	public void setCenarioBaseInstance(CenarioBase cenarioBaseInstance) {
		this.cenarioBaseInstance = cenarioBaseInstance;
	}

	public LazyDataModel<CenarioBase> getCenarioBaseList() {
		return cenarioBaseList;
	}

	public void setCenarioBaseList(LazyDataModel<CenarioBase> cenarioBaseList) {
		this.cenarioBaseList = cenarioBaseList;
	}

	public String getVarNome() {
		return varNome;
	}

	public void setVarNome(String varNome) {
		this.varNome = varNome;
	}

	public String getVarFluxo() {
		return varFluxo;
	}

	public void setVarFluxo(String varFluxo) {
		this.varFluxo = varFluxo;
	}
	
	public CenarioBase[] getCenariosSelecionados() {
		return cenariosSelecionados;
	}
	
	public void setCenariosSelecionados(CenarioBase[] cenariosSelecionados) {
		this.cenariosSelecionados = cenariosSelecionados;
	}
	
	public String getMsgExclusao() {
		return msgExclusao;
	}
	
	public void setMsgExclusao(String msgExclusao) {
		this.msgExclusao = msgExclusao;
	}
}